package bean.circular.dependency.construct;

import org.junit.Test;
import org.springframework.beans.factory.BeanCurrentlyInCreationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author com.alibaba.lizhen
 * @Date 2021/4/9 7:15 下午
 * @Version 1.0
 * @Description
 */
public class ConstructTest {


	/**
	 * 构造器的循环依赖，无法解决。最终OOM
	 */
	@Test
	public void test() {
		new A();
		new B();
	}

	/**
	 * Spring的解决方式.
	 *  当实例化A的时候，会先把a放入到当前创建bean池子中。发现需要构造参数B，去创建B。
	 *  当实例化A的时候，会先把b放入到当前创建bean池子中。发现需要构造参数A，去创建A。
	 *  再去创建A，发现当前创建bean池子已经有A，则直接抛异常 BeanCurrentlyInCreationException
	 */
	@Test
	public void Spring() {

		try {
			ApplicationContext context
					= new ClassPathXmlApplicationContext("bean.circular.dependency/construct.xml");
			System.out.println(context.getBean("a", A.class));
		} catch (BeanCurrentlyInCreationException e) {
			e.printStackTrace();
		}
	}
}
